package solitaire.controle;

import solitaire.InterfacesControle.ICCarte;
import solitaire.InterfacesControle.ICColonne;
import solitaire.InterfacesControle.ICTas;
import solitaire.InterfacesControle.ICTasDeCartes;
import solitaire.InterfacesPresentation.IPColonne;
import solitaire.application.Carte;
import solitaire.application.Colonne;
import solitaire.application.Usine;
import solitaire.presentation.PColonne;

public class CColonne extends Colonne implements ICColonne{
	private IPColonne presentation;

	public CColonne(String nom, Usine usine) {
		super(nom, usine);
		presentation = new PColonne(((ICTas) super.visibles).getPresentation(),((ICTas) super.cachees).getPresentation());
		presentation.setControleur(this);
	}

	@Override
	public boolean isICCarteRetournable() {
		return super.isCarteRetournable();
	}

	@Override
	public boolean isEmpilable(ICCarte carte) {
		return super.isEmpilable(carte.getAbstraction());
	}

	@Override
	public boolean isEmpilable(ICTas tas) {
		return super.isEmpilable(tas.getAbstraction());
	}

	@Override
	public boolean isEmpilable(ICTas tas, int n) {
		return super.isEmpilable(tas.getAbstraction(), n);
	}

	@Override
	public void retournerCCarte() {
		try {
			if(isICCarteRetournable()){
				super.retournerCarte();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	@Override
	public void setReserve(ICTas reserve) {
		super.setReserve(reserve.copy().getAbstraction());
		
	}

	@Override
	public Colonne getAbstraction() {
		return this;
	}

	@Override
	public IPColonne getPresentation() {
		return presentation;
	}

	@Override
	public void empiler(Carte cartet) {
		ICCarte carte=(ICCarte) cartet;
		super.empiler(carte.getAbstraction());
		presentation.empiler(carte.getPresentation());
		presentation.getJComponent().repaint();
		
	}

	@Override
	public ICCarte getICCarteBase() {
		ICCarte carte=null;
		try {
			carte=(ICCarte) super.getBase();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return carte;
	}

	@Override
	public ICCarte getICCarte(int n) {
		ICCarte carte=null;
		try {
			carte=(ICCarte) super.getCarte(n);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return carte;
	}

	@Override
	public ICCarte getICCarteSommet() {
		ICCarte carte=null;
		try {
			carte=(ICCarte) super.getSommet();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return carte;
	}

	@Override
	public void recopier(ICTas tas) {
		super.recopier(tas.copy().getAbstraction());
		
	}

	@Override
	public void depilerICCarte() {
		try {
			super.depiler();
		} catch (Exception e) {
			e.printStackTrace();
		}
		presentation.depiler();
		
	}

	@Override
	public ICTas copy() {
		ICTas tas=null;
		try {
			tas= (ICTas) this.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return tas;
	}

	@Override
	public void clicTasCache() {
		//si pas de carte sur le dessus du paquet, alors on retourne une carte
		System.out.println(super.visibles.getNombre());
		if(super.visibles.getNombre()==0){
			try {
				super.retournerCarte();
				retournerCCarte();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
	}

	@Override
	public ICTasDeCartes getTasVisible() {
		ICTasDeCartes tas=null;
		tas=(ICTasDeCartes) super.visibles;
		return tas;
	}

	@Override
	public ICTasDeCartes getTasCache() {
		ICTasDeCartes tas=null;
		tas=(ICTasDeCartes) super.cachees;
		return tas;
	}

	@Override
	public void empiler(ICTas tas) {
		super.empiler(tas.getAbstraction());
	}

}
